package com.manage.common.utils;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Base64;

@Component
public class AESUtil {

    static {
        // 添加BouncyCastle作为安全提供者
        Security.addProvider(new BouncyCastleProvider());
    }

    // 密钥和 IV
    @Value("${aes.key}")
    private String KEY;  // 16字节（128位）

    @Value("${aes.iv}")
    private String IV;   // 16字节（128位）

    // 加密算法配置
    private static final String ALGORITHM = "AES/CBC/ZeroBytePadding";

    /**
     * AES 加密
     * @param plainText 明文
     * @return Base64 编码的密文
     */
    public String encrypt(String plainText) {
        try {
            // 1. 初始化密钥和 IV
            SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES");
            IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes());

            // 2. 初始化 Cipher
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

            // 3. 加密
            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());

            // 4. 返回 Base64 编码的密文
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            throw new RuntimeException("AES 加密失败", e);
        }
    }

    /**
     * AES 解密
     * @param encryptedText Base64 编码的密文
     * @return 解密后的明文
     */
    public String decrypt(String encryptedText) {
        try {
            // 1. 初始化密钥和 IV
            System.out.println(KEY);
            System.out.println(IV);
            // 将Base64编码的密钥和IV转换为字节数组
            byte[] aesKeyBytes = KEY.getBytes(StandardCharsets.UTF_8);
            byte[] aesIvBytes = IV.getBytes(StandardCharsets.UTF_8);

            // 创建密钥和IV规范
            SecretKeySpec aesKeySpec = new SecretKeySpec(aesKeyBytes, "AES");
            IvParameterSpec ivSpec = new IvParameterSpec(aesIvBytes);

            // 创建Cipher实例并初始化为解密模式
            Cipher cipher = Cipher.getInstance("AES/CBC/ZeroBytePadding", "BC");
            cipher.init(Cipher.DECRYPT_MODE, aesKeySpec, ivSpec);

            // 将Base64编码的数据解码为字节数组
            byte[] base64DecodedBytes = Base64.getDecoder().decode(encryptedText);

            // 执行解密
            byte[] decryptedBytes = cipher.doFinal(base64DecodedBytes);

            // 将解密后的字节数组转换为字符串
            String decryptedString = new String(decryptedBytes, StandardCharsets.UTF_8);

            return decryptedString;
        } catch (Exception e) {
            throw new RuntimeException("AES 解密失败", e);
        }
    }
}
